#ifndef __STD_SERVER_H_
#define __STD_SERVER_H_

#include <iostream>
#include <memory>
#include <unistd.h>
#include <cstring>
#include <string.h>

struct stdTcpServerPrivate  //智能指针封装参数
{
    /* 监听的句柄 */
    int m_sockfd;

    /* 服务器是否在监听 */
    bool m_isRunning;
};

struct stdTcpSocketPrivate
{
    /* 通信句柄 */
    int connfd;

    /* 通信是否建立成功 */
    bool m_connected;
};

/*--------------通信类(封装客户端函数）--------------*/
class StdTcpSocket
{
public:
    /* 构造函数 */
    StdTcpSocket();

    /* 析构函数 */
    ~StdTcpSocket();

public:
    /* 连接服务器 */
    int connectToServer(const char * ip, int port);

    /* 是否连接成功 */
    bool isConnected() const;

    /* 发送数据 */
    int sendMessage(const std::string & sendMsg);
    int sendMessage(const void * sendMsg, size_t n);

    /* 接收数据 */
    int recvMessage(std::string & recvMsg);
    int recvMessage(void * buf, size_t n);

    /* 设置属性 */
    stdTcpSocketPrivate * getSockAttr() const;  //加const作用：所有成员变量不能修改

private:
    /* 智能指针 */
    std::unique_ptr<stdTcpSocketPrivate> m_sockAttr;
};

/* 类型别名 */
using StdTcpSocketPtr = std::shared_ptr<StdTcpSocket>;

/*--------------服务器类--------------*/
class StdTcpServer
{
public:
    /* 无参构造 */
    StdTcpServer();

    /* 析构函数 */
    ~StdTcpServer();
public:
    /* 设置监听 */
    bool setListen(int port);

    /* 接收客户端的连接 */
    StdTcpSocketPtr getClientSock();

private:
    /* 端口属性 */
    int m_port;

    /* 智能指针 */
    /* 服务器的属性 */
    std::unique_ptr<stdTcpServerPrivate> m_tcpAttr;    //指针可以节省大小，但是担心没有释放，所以用智能指针

};

#endif